import pygame
# 导入 pygame 库，用于矩形操作
import random
# 导入 random 库，用于随机化

# 生成动态障碍物（初始在屏幕外，带随机速度和方向）
# 定义一个函数，用于生成动态障碍物
def generate_dynamic_obstacles(obstacle_count,obstacle_size,screen_x,screen_y,min_speed,max_speed,snake_body, food_rect):
    """生成动态障碍物（初始在屏幕外）"""
    # 创建一个空列表，用来存放生成的障碍物
    obstacles = []
    # 创建一个列表，存放所有可能的 x 坐标（按格子对齐）
    all_x_pos = []  # 障碍物X轴位置（屏幕内随机）
    for x in range(25, screen_x - 25, 25):
        all_x_pos.append(x)
        """
        1.range() 函数用来生成一个数字序列。它有三个参数：range(起始值, 结束值, 步长)。
        左闭右开，步长 (step): 25，意味着序列中的每个数字都比前一个数字大 25；
        2..append() 是 Python 列表的一个方法，作用是将一个元素添加到列表的末尾。
        """

    # 循环直到生成了足够数量的障碍物
    while len(obstacles) < obstacle_count:
        # 随机选择初始位置（上方屏幕外 或 下方屏幕外）
        # 随机决定障碍物是从顶部出生还是从底部出生
        spawn_side = random.choice(["top", "bottom"])
        """1.random 是 Python 中用来生成伪随机数的标准库，
        2.random.choice(sequence)
        作用：从一个序列（比如列表或元组）中随机挑选一个元素,
        spawn_side = random.choice(["top", "bottom"])，就是 50% 的概率返回 "top"，50% 的概率返回 bottom"""
        if spawn_side == "top":
            # Y坐标设置在屏幕的上方外部
            # 上方外：Y轴=-OBSTACLE_SIZE（完全在屏幕上外）
            y_pos = -obstacle_size
            # 速度是正数，表示向下移动
            speed_y = random.uniform(min_speed, max_speed)  # 向下移动
        else:
            # 下方外：Y轴=SCREEN_Y（完全在屏幕下外）
            # Y坐标设置在屏幕的下方外部
            y_pos = screen_y
            # 速度是负数，表示向上移动
            speed_y = -random.uniform(min_speed, max_speed)  # 向上移动
            """
            1.random.uniform(a, b) 是 Python random 模块中的一个函数,会返回一个在 a 和 b 之间的随机浮点数（也就是小数）。
            这个数字可能等于 a，也可能等于 b
            """

        # 随机X轴位置
        x_pos = random.choice(all_x_pos)
        # 创建障碍物的矩形对象
        obs_rect = pygame.Rect(x_pos, y_pos, obstacle_size, obstacle_size)
        """
        1.pygame.Rect 是 Pygame 库自带的一个核心类 (class)
        2.pygame.Rect 对象是一个用来表示和操作一个矩形区域的虚拟对象。本身是不可见的，你不会在屏幕上“看到”一个 Rect。
        它更像是一个围绕着你的游戏角色、子弹、障碍物的隐形“碰撞箱”或“边界框”
        3.pygame.Rect() 需要四个参数： pygame.Rect(left, top, width, height)
        left:矩形左上角的 X 坐标 (在你的代码里是 x_pos)。
        top: 矩形左上角的 Y 坐标 (在你的代码里是 y_pos)。
        width: 矩形的宽度 (在你的代码里是 obstacle_size)。
        height: 矩形的高度 (在你的代码里是 obstacle_size)
        4.rect可以用来碰撞检测 (Collision Detection)
        colliderect() 这个函数会自动帮你检查两个矩形是否有任何重叠的部分
        5.当你需要把一张图片绘制到屏幕上时，screen.blit() 函数可以直接使用 Rect 对象。
        Pygame 会自动从 obs_rect 中读取 (x, y) 坐标，然后把图片画在这个位置。
        """
        # 安全性检查，防止初始位置重叠
        # 先假设这个位置不重叠
        # 检查是否与蛇身、食物重叠
        overlap = False
        # 检查是否与蛇或食物重叠（虽然此时障碍物在屏幕外，但严谨起见保留检查）
        if obs_rect in snake_body or obs_rect.colliderect(food_rect):
            overlap = True
        # 检查是否与已生成的障碍物重叠
        for existing_obs in obstacles:
            if obs_rect.colliderect(existing_obs["rect"]):
                overlap = True
                break# 只要有一个重叠，就不用再检查了
        # 如果检查后没有发现任何重叠
        if not overlap:
            # 就把这个新创建的障碍物（包含矩形和速度）添加到列表中
            obstacles.append({
                "rect": obs_rect,
                "speed_y": speed_y
            })
    # 返回包含所有障碍物的列表
    return obstacles

# 定义一个函数，用于更新障碍物的位置
# 更新动态障碍物位置（移入屏幕+边缘反弹）
def update_dynamic_obstacles(obstacles,screen_y):
    """更新障碍物位置，并在屏幕边缘实现反弹"""
    for obs in obstacles:
        # 按速度移动障碍物
        # 遍历每一个障碍物
        # 根据速度更新障碍物的 y 坐标
        obs["rect"].y += obs["speed_y"]
        # 边缘反弹逻辑
        # 碰到屏幕上边缘（Y<0）：反向为向下移动
        # 如果障碍物的底部移过了屏幕的上边缘 (即完全移出屏幕上方)
        if obs["rect"].bottom < 0:
            # 就把它的速度变为正数（强制向下移动）
            # abs() 函数取绝对值，确保速度是正的
            obs["speed_y"] = abs(obs["speed_y"])
        # 碰到屏幕下边缘（Y+size>SCREEN_Y）：反向为向上移动
        # 如果障碍物的顶部移过了屏幕的下边缘 (即完全移出屏幕下方)
        elif obs["rect"].top > screen_y:
            # 就把它的速度变为负数（强制向上移动）
            obs["speed_y"] = -abs(obs["speed_y"])

# 绘制动态障碍物
# 定义一个函数，用于绘制障碍物
def draw_dynamic_obstacles(screen, obstacles):
    """绘制所有障碍物，并添加金色边框"""
    # 遍历每一个障碍物
    for obs in obstacles:
        # 绘制障碍物的主体（深灰色）
        pygame.draw.rect(screen, (50, 50, 50), obs["rect"])  # 主体（深灰）
        # 在主体矩形上再画一个线框，作为边框效果
        # 最后一个参数 2 表示线框的宽度为2像素
        pygame.draw.rect(screen, (255, 215, 0), obs["rect"], 2)  # 边框（金色）

